package com.mmaingenieria.GestorFacturacion.model;

import com.mmaingenieria.GestorFacturacion.beans.Usuario;
import com.mmaingenieria.GestorFacturacion.enumeraciones.Rol;
import com.mmaingenieria.GestorFacturacion.model.interfaces.InterfaceUsuarioDAO;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.ResourceBundle;

/**
 *
 * @author Mikle
 */
public class MySqlUsuarioDAO implements InterfaceUsuarioDAO{

    
    //creamos un resouceBoundle que leera el archivo excepciones.properties
    //y segun la variable escribira una cosa u otra.
    private static ResourceBundle rb;
    
    //Construtor
    //*************************************************************************
    public MySqlUsuarioDAO() {
        //decimos que lea dicho archivo
        //rb = ResourceBundle.getBundle("com.mmaingenieria.GestorFacturacion.exceptions.excepciones");
    }
    
    
    //Metodos que hay que implementar por extender de InterfaceUsuario
    //*************************************************************************
    
    /**
     * 
     */
    public synchronized ArrayList<Usuario> getUsuarios() throws Exception {
        ArrayList<Usuario> listausuarios = new ArrayList<Usuario>();
        Connection conexion = null;
        String sql = null;

        sql = "SELECT usuario_id, dni, nombre, apellido1,apellido2, usuario, password, email, date_created, rol, estado FROM usuario";

        try 
        {
        	//Se establece la conexion con la BD
            conexion = MySqlDAOFactory.conectar();
            
            PreparedStatement stmt = conexion.prepareStatement(sql);
            
            //Se ejecuta la query
            ResultSet resultadoquery = stmt.executeQuery();            
            
            //Se recorre la lista de usuarios
            while (resultadoquery.next()) 
            {
                listausuarios.add(instanciarUsuario(resultadoquery));
            }            
        } 
        catch (Exception ex) 
        {
        	throw ex;
        } 
        finally 
        {
        	//Se cierra la conexion con la BD
            MySqlDAOFactory.desconectar(conexion);
        }

        return listausuarios;
    }
    
    /**
     * Metodo para recoger usuario por nombre 
     */
    public synchronized Usuario getUsuarioByName (String nombre) throws Exception {
    	Connection conexion = null;
        Usuario usuario = new Usuario();               
        String sql = "SELECT usuario_id, dni, nombre, apellido1,apellido2, usuario, password, email, date_created, rol, estado FROM mma.usuario WHERE usuario= ?";
        
        try 
        {
        	//Se establece la conexion con la BD
            conexion = MySqlDAOFactory.conectar();
            
            PreparedStatement stmt = conexion.prepareStatement(sql);
            stmt.setString(1, nombre);

            //Se ejecuta la query
            ResultSet resultadoquery = stmt.executeQuery();        
            
            while (resultadoquery.next()) 
            {
            	//Se pasan los valores obtenidos a un objeto Usuario
            	usuario = instanciarUsuario(resultadoquery);
            }
        } 
        catch (Exception ex) 
        {
        	throw ex;
        } 
        finally 
        {
        	//Se cierra la conexion con la BD
            MySqlDAOFactory.desconectar(conexion);
        }
        
        return usuario;
    }
    
    
    
    //Metodos
    //*************************************************************************
    public Usuario instanciarUsuario(ResultSet rs) throws Exception
    {    	
    	Usuario usuario = new Usuario();
        usuario.setId(rs.getInt("usuario_id"));
        usuario.setDni(rs.getString("dni"));
        usuario.setNombre(rs.getString("nombre"));
        usuario.setApellido1(rs.getString("apellido1"));
        usuario.setApellido2(rs.getString("apellido2"));
        usuario.setUsuario(rs.getString("usuario"));
        usuario.setPassword(rs.getString("password"));
        usuario.setEmail(rs.getString("email"));
        usuario.setEstado(rs.getInt("estado"));
        usuario.setDateCreated(rs.getLong("date_created"));
        usuario.setRol(rs.getInt("rol"));

        return usuario;
    }


	
	public Usuario getUsuarioByID(Integer usuarioId) throws Exception {
		//Inicializamos las conexiones y variables
		Usuario usuario = new Usuario();
        Connection conexion = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;       
        String sql = "SELECT * FROM USUARIO WHERE usuario_id = ?";        
      
        try 
        {
        	//Establecemos la conexion con la BD
            conexion = MySqlDAOFactory.conectar();
            
            stmt = conexion.prepareStatement(sql);            
            stmt.setInt(1, usuarioId);
                        
            //Se ejecuta la query
            rs = stmt.executeQuery();
            
            while(rs.next())
            {
            	//Pasamos los datos del resulset a un objeto usuario
            	usuario = instanciarUsuario(rs);	
            }
            
        	return usuario;            
        } 
        catch (Exception ex) 
        {
        	throw ex;       	
        }
        finally
        {
        	//Se cierra la conexion con la BD
            MySqlDAOFactory.desconectar(conexion);
        }        
	}


	
    
	@Override
	public boolean deleteUsuario(Integer idUsuario) throws Exception {
		boolean resultado = false;
		Connection conexion = null;
        String sql = "DELETE FROM usuario WHERE usuario_id =?";       
        try {
            conexion = MySqlDAOFactory.conectar();
        	PreparedStatement stmt = conexion.prepareStatement(sql);//preparas la query
        	stmt.setInt(1,idUsuario);
        	
        	stmt.executeUpdate();//ejecutas la query       
        	resultado= true;
        } catch (Exception ex) {
        	throw ex;
        } finally {
            MySqlDAOFactory.desconectar(conexion);
        } 
        return resultado;
	}


	@Override
	public boolean addUsuario(Usuario user)throws Exception{
		boolean resultado = false;
		Connection conexion = null;
        String sql = null;
        sql = "INSERT INTO usuario (usuario, password, nombre, apellido1, apellido2, email, dni, rol, estado) VALUES (?,?,?,?,?,?,?,?,?)";
        try {
            conexion = MySqlDAOFactory.conectar();
        	PreparedStatement stmt = conexion.prepareStatement(sql);//preparas la query
        	stmt.setString(1,user.getUsuario());
        	stmt.setString(2,user.getPassword());
        	stmt.setString(3,user.getNombre());
        	stmt.setString(4,user.getApellido1());
        	stmt.setString(5,user.getApellido2());
        	stmt.setString(6,user.getEmail());
        	stmt.setString(7,user.getDni());       	
        	stmt.setInt(8,user.getNumeroRol());
        	stmt.setInt(9, user.getEstado());
        	stmt.executeUpdate();//ejecutas la query       
        	resultado= true;
        } catch (Exception ex) {
        	throw ex;
        }
        finally {
            MySqlDAOFactory.desconectar(conexion);
        } 
		return resultado;
	}
    
    @Override
	public boolean updateUsuario(Usuario user) {

        Connection conexion = null;
        String sql = null;

        //Se realiza la sentencia de actualizar los valores recogidos en el formulario en la tabla de la BBDD
        sql = "UPDATE usuario SET dni ='" + user.getDni()
        		+ "' , nombre ='" + user.getNombre()
        		+ "' , apellido1 ='" + user.getApellido1()
        		+ "' , apellido2 ='" + user.getApellido2()
        		+ "' , usuario ='" + user.getUsuario()
        		+ "' , password ='" + user.getPassword()
        		+ "' , email ='" + user.getEmail() 
        		+ "' , rol =" + user.getNumeroRol() + 
        		" WHERE usuario_id= " + user.getId();
        try {
            conexion = MySqlDAOFactory.conectar();
        } catch (Exception ex) {
        	ex.printStackTrace();
        }
        
		
		try{
            PreparedStatement stmt = conexion.prepareStatement(sql);//preparas la query
            int numeroRegistrosActualizados = stmt.executeUpdate();

 
        } catch (SQLException ex) {
        	ex.printStackTrace();
        } finally {
            MySqlDAOFactory.desconectar(conexion);
        }

		return false;
	}
    public int getUsuarioByNif(Usuario user) throws Exception {
		//Inicializamos las conexiones y variables
        Connection conexion = null;
        PreparedStatement stmt = null;
        ResultSet rs = null;       
        String sql = "SELECT usuario_id FROM USUARIO WHERE dni = ?";        

        try 
        {
            int tempid = 0;
        	//Establecemos la conexion con la BD
            conexion = MySqlDAOFactory.conectar();
            
            stmt = conexion.prepareStatement(sql);            
            stmt.setString(1, user.getDni());
                        
            //Se ejecuta la query
            rs = stmt.executeQuery();
            
            while(rs.next())
            {
            	//Pasamos los datos del resulset a un objeto usuario
            	tempid= rs.getInt("usuario_id");
            	//usuario = instanciarUsuario(rs);	
            }
            
        	return tempid;            
        } 
        catch (Exception ex) 
        {
        	throw ex;       	
        }
        finally
        {
        	//Se cierra la conexion con la BD
            MySqlDAOFactory.desconectar(conexion);
        }        
	}
    
    
}
